#!/usr/bin/python3
# encoding:utf-8

import logging
from multiprocessing.pool import ThreadPool
from urllib import parse

import pandas as pd
import requests
from bs4 import BeautifulSoup
from page_read import parse_stock_code
from api import query_code
import pprint
pp=pprint.PrettyPrinter(indent=4)


class SearchInformation:
    """
        :keywords  列表  可同时多个查询
        :proxies  可用代理 {
            'http': 'http://192.168.0.1:0000',
            'https': 'https://192.168.0.1:0000',
        }
        :processes  开启的线程数
    """
    def __init__(self, keywords=None, proxies=None, processes=1):
        self.keywords = keywords
        self.proxies = proxies
        self.processes = processes

    # 访问层
    def _request(self, key, retry):
        try:
            key_info = self._format(key)
            if self.proxies:
                resp = requests.get(url=key_info[0], headers=key_info[1], proxies=self.proxies, timeout=5)
            else:
                resp = requests.get(url=key_info[0], headers=key_info[1], timeout=5)

            if not resp.status_code == 200:
                return resp.status_code

            resp.encoding = 'utf-8'
            return self._parse(resp.text)
        except TimeoutError:
            if retry < 3:
                return self._request(key, retry + 1)
        except Exception as e:
            logging.warning(e)

    # 多线程
    def thread_req(self, Async=True):
        results = []
        pool = ThreadPool(processes=self.processes)

        thread_list = []
        for key in self.keywords:
            if Async:
                out = pool.apply_async(func=self._request, args=(key, 0,))  # 异步
            else:
                out = pool.apply(func=self._request, args=(key, 0,))  # 同步
            thread_list.append(out)

        pool.close()
        pool.join()

        # 获取输出结果
        if Async:
            for p in thread_list:
                thread_result = p.get()  # get会阻塞
                results.extend([i for i in thread_result if i])

        return results

    # 请求头
    @staticmethod
    def _format(key):
        url = 'http://www.baidu.com/s?rtt=1&bsst=4&cl=4&tn=news&ie=utf-8&word={}'.format(parse.quote(key))
        headers = {
            'Accept': 'application/json, text/javascript, */*; q=0.01',
            'Accept-Encoding': 'gzip, deflate, br',
            'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
            'Cache-Control': 'no-cache',
            'Connection': 'keep-alive',
            'Host': 'www.baidu.com',
            'Pragma': 'no-cache',
            'Referer': url,
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.75 Safari/537.36'
        }
        return url, headers

    # 解析
    @staticmethod
    def _parse(pagesource):
        soup = BeautifulSoup(pagesource, 'lxml')
        data_list = []
        try:
            for div in soup.find_all('div', {'tpl': 'news-normal'}):
                try:
                    link = div.find('a').get('href')
                except:
                    link = None

                try:
                    title = div.find('a').get_text().strip().replace('\n', '').replace('\t', '').replace('\r', '')
                except:
                    title = None

                try:
                    upload_time = div.find('div', {'class': 'news-source_Xj4Dv'}).find_all('span')[
                        -1].get_text().strip().replace('\n',
                                                       '').replace(
                        '\t', '').replace('\r', '')
                except:
                    upload_time = None

                data_list.append({
                    'link': link,
                    'title': title,
                    'upload_time': upload_time
                })
        except Exception as e:
            logging.warning(e)
        return data_list


if __name__ == '__main__':
    import os,sys
    import pandas
    # keys = ['平安银行', '股票']
    # sk = SearchInformation(keys)
    # pp.pprint(sk.thread_req())
    #
    # orgs = "国家主席|人大代表|人民代表大会|人民法院|发改委|中央银行|委员会|教育部|人民政府办公室|公安部|人民检查院|国家卫健委"
    # detail = '股票板块|股票大涨|高开低走|高开高走|低开高走|妖股|连板|涨停|涨停板|暴涨'
    detail = '股票板块|股票大跌|妖股|连板|跌停|跌停板|暴跌'
    industry = '光伏|白酒股票|有色金属|锂电池股票|芯片股票|半导体|医疗股票|中医板块|新能源股票|军工股'
    index = "沪深300|南向资金|北向资金|"
    all_kw = "妖股|涨停|连板|龙头股|绩优股|大涨|连续上涨".split('|')
    download_stock = True
    if download_stock:
        data_d = {}
        for ind in (all_kw):
            print('----------')
            sk = SearchInformation([ind])
            res = sk.thread_req()
            #pp.pprint()
            data_d[ind] = res
            """
            {   'link': 'http://www.mem.gov.cn/gk/zfxxgkpt/fdzdgknr/202107/t20210716_392181.shtml',
            'title': '应急管理部办公厅 工业和信息化部办公厅 科学技术部办公厅关于...',
            'upload_time': '今天'}
            """

        html =  """
        <!DOCTYPE html>
    <html>
    <head> 
    <meta charset="utf-8"> 
    <title>菜鸟教程(runoob.com)</title> 
    </head>
    <body>
    
    {}
    
    </body>
    </html>
        """
        rows = []
        datas = []
        stock_d = {'002759': '天际股份', '300543': '朗科智能', '002449': '国星光电', '300777': '中简科技', '000063': '中兴通讯', '300241': '瑞丰光电', '600958': '东方证券', '002297': '博云新材', '002415': '海康威视', '603686': '龙马环卫', '300541': '先进数通', '001211': '双枪科技', '300323': '华灿光电', '000902': '新洋丰', '601377': '兴业证券', '300303': '聚飞光电', '600872': '中炬高新', '002601': '龙佰集团', '600918': '中泰证券', '300118': '东方日升', '601995': '中金公司', '600862': '中航高科', '300075': '数字政通', '300699': '光威复材', '000997': '新 大 陆', '603385': '惠达卫浴', '002654': '万润科技', '301042': '安联锐视', '600405': '动力源', '300140': '中环装备', '300750': '宁德时代', '603288': '海天味业', '603939': '益丰药房', '002697': '红旗连锁', '601933': '永辉超市', '002607': '中公教育', '603233': '大参林', '300024': '机器人', '603486': '科沃斯', '603505': '金石资源', '002326': '永太科技', '300160': '秀强股份', '300655': '晶瑞股份', '601678': '滨化股份', '002442': '龙星化工', '000012': '南 玻Ａ', '600160': '巨化股份', '300343': '联创股份', '002407': '多氟多', '002647': '仁东控股', '601606': '长城军工', '600331': '宏达股份', '000520': '长航凤凰', '200029': '深深房Ｂ', '106020': '江苏1714', '600699': '均胜电子', '600260': '凯乐科技', '688303': '大全能源', '002803': '吉宏股份', '603777': '来伊份', '002772': '众兴菌业', '000752': '*ST西发', '600519': '贵州茅台', '600779': '水井坊', '600252': '中恒集团', '160221': '国泰有色', '165520': '信诚有色', '159980': '有色ETF', '159871': '有色金属', '002155': '湖南黄金', '301020': '密封科技', '300284': '苏交科', '000996': '中国中期', '000003': 'PT金田A', '002847': '盐津铺子', '000037': '深南电A', '000672': '上峰水泥', '601921': '浙版传媒', '300350': '华鹏飞', '688981': '中芯国际', '603501': '韦尔股份', '002579': '中京电子', '600667': '太极实业', '688589': '力合微', '002463': '沪电股份', '688256': '寒武纪', '002913': '奥士康', '300476': '胜宏科技', '300852': '四会富仕', '300077': '国民技术', '300739': '明阳电路', '688521': '芯原股份', '605258': '协和电子', '603920': '世运电路', '688126': '沪硅产业', '600183': '生益科技', '002079': '苏州固锝', '300706': '阿石创', '300903': '科翔股份', '600055': '万东医疗', '159828': '医疗ETF', '002382': '蓝帆医疗', '002606': '大连电瓷', '300265': '通光线缆', '002660': '茂硕电源', '600312': '平高电气', '300014': '亿纬锂能', '000973': '佛塑科技', '000690': '宝新能源', '002594': '比亚迪', '300510': '金冠股份', '600893': '航发动力', '600038': '中直股份', '603678': '火炬电子', '600316': '洪都航空', '002985': '北摩高科', '300593': '新雷能', '002025': '航天电器', '002049': '紫光国微', '603712': '七一二', '300114': '中航电测', '300455': '康拓红外', '600150': '中国船舶', '000768': '中航西飞', '600760': '中航沈飞', '300775': '三角防务', '300474': '景嘉微', '300010': '豆神教育', '603336': '宏辉果蔬', '003032': '传智教育', '000998': '隆平高科', '002659': '凯文教育', '300896': '爱美客', '000526': '学大教育', '603719': '良品铺子', '105020': '天津1832', '002011': '盾安环境'}

        for k,res in data_d.items():
            for item in res:
                datas.append((item['link'],item['title'],item['upload_time'],k))
                time_kw = ['昨天', "前天", "今天", "小时", "分钟"]
                if not any(u in item['upload_time'] for u in time_kw):
                    continue
                """
                            {   'link': 'http://www.mem.gov.cn/gk/zfxxgkpt/fdzdgknr/202107/t20210716_392181.shtml',
                        'title': '应急管理部办公厅 工业和信息化部办公厅 科学技术部办公厅关于...',
                        'upload_time': '今天'}
                """
                codes ,txt= parse_stock_code(item['link'])
                all_content = '|'.join(txt)
                codes = list(set(codes))
                str_ = []
                if len(codes) > 0:
                    for c in codes:
                        res = query_code(c)
                        if c in stock_d:
                            name = stock_d[c]
                            if len(name) > 1:

                                if name not in all_content:
                                    continue
                                str_.append(" {}({}) ".format(c, name))
                        else:
                            name = res.split(',')[0]
                            if name not in all_content:
                                continue
                            if len(name)>1:
                                stock_d[c] = name
                                str_.append(" {}({}) ".format(c,name))
                row = "<a href=\"{}/\" target=\"_blank\">{}</a>{}   {}</br>".format(item['link'],item['title'],item['upload_time'],"|".join(str_))
                rows.append(row)
            rows.append("</br>")

        print(stock_d)
        #df = pd.DataFrame(datas,columns=['link','title','upload_time','keyword'])
        #df.to_csv('7-16.csv')
        #df.to_excel('7-16.xlsx')
        with open("news_stock.html","w",encoding='utf-8') as f:
            f.write(html.format('\n'.join(rows)))
    depart = """
    中华人民共和国外交部
    中华人民共和国国家发展和改革委员会
    中华人民共和国科学技术部
    中华人民共和国国家民族事务委员会
    中华人民共和国国家安全部
    中华人民共和国司法部
    中华人民共和国人力资源和社会保障部
    中华人民共和国生态环境部
    中华人民共和国交通运输部
    中华人民共和国农业农村部
    中华人民共和国文化和旅游部
    中华人民共和国退役军人事务部
    中国人民银行
    中华人民共和国国防部
    中华人民共和国教育部
    中华人民共和国工业和信息化部
    中华人民共和国公安部
    中华人民共和国民政部
    中华人民共和国财政部
    中华人民共和国自然资源部
    中华人民共和国住房和城乡建设部
    中华人民共和国水利部
    中华人民共和国商务部
    中华人民共和国国家卫生健康委员会
    中华人民共和国应急管理部
    中华人民共和国审计署
    """
    def org_download():
        html = """
               <!DOCTYPE html>
           <html>
           <head> 
           <meta charset="utf-8"> 
           <title>菜鸟教程(runoob.com)</title> 
           </head>
           <body>

           {}

           </body>
           </html>
               """
        departs = depart.split()
        departs =[u.replace('中华人民共和国','')  for u in departs]
        data_d = {}
        for dep in departs:
            sk = SearchInformation([dep])
            data_d[dep] = sk.thread_req()
            #pp.pprint(sk.thread_req())

        datas = []
        rows= []
        time_kw = ['昨天',"前天","今天","小时","分钟"]
        for k, res in data_d.items():
            rows.append("<p>{}</p></br>".format(k))
            for item in res:
                datas.append((item['link'], item['title'], item['upload_time'], k))
                if any([u in  item['upload_time'] for u in time_kw ]):
                    row = "<a href=\"{}/\" target=\"_blank\">{}</a>{}</br>".format(item['link'], item['title'],
                                                                                   item['upload_time'])
                    rows.append(row)

        with open("国家新闻.html", "w", encoding='utf-8') as f:
            f.write(html.format('\n'.join(rows)))
        #df = pd.DataFrame(datas, columns=['link', 'title', 'upload_time', 'keyword'])
        #df.to_excel('7-18国家机构消息.xlsx')

        #df.to_csv('7-16国家机构消息.csv')
    org_download()
    #print(departs)